<?
/**
 __set, __get 과 같은 매직 메소드들은 class 내에 private 또는 protected 변수에만 적용이 됩니다.
즉 public 으로 선언된 변수는 아무 상관이 없다
어떤 클래스를 설계하는 과정에서 private 변수 $a 가 필요하고
이 변수를 외부에서 사용해야 한다고 가정하겠습니다.
 
그렇다면 이 변수는 직접 접근이 불가능 하므로
변수에 값을 저장,출력,삭제,확인 하는 메소드들을 만들어야 할 것입니다.
*/



class Test {
    private $a;
 
    public function __set($name, $value) { //저장
        $this->$name = $value;
    }
    public function __get($name) { //출력
        return $this->$name;
    }
 
    public function __unset($name) { // 삭제
        unset($this->$name);
    }
 
    public function __isset($name) { //확인
        return isset($this->$name);
    }
}

$obj = new Test;
$obj->set('a', 1);
echo $obj->set('a');
?>

<?
// private, protected 로 정의된 변수를 public 변수와 같이 바로 사용이 가능하다

$obj = new Test;
 
$obj->a = 1; // __set 메소드 실행됨
 
if(isset($obj->a)) { // __isset 메소드 실행됨
    echo $obj->a; // __get 메소드 실행됨
}
 
unset($obj->a); // __unset 메소드 실행됨
?>
